import json
from django import forms
from django.shortcuts import render, HttpResponse, redirect
from django.http import JsonResponse
from django.views.decorators.csrf import csrf_exempt

from app01 import models
from app01.utils.bootstrap import BootStrapModelForm
from app01.utils.pagination import Pagination

class TaskModelForm(BootStrapModelForm):  # 继承自 BootStrapModelForm 类
    # 这意味着 TaskModelForm 将继承 BootStrapModelForm 的所有属性和方法，包括自动应用 Bootstrap 样式的能力
    class Meta:  # 嵌套在 TaskModelForm 类中的元类，用于提供表单的元数据配置
        model = models.Task  # 指定了 TaskModelForm 表单所对应的 Django 模型是 Task
        # fields = "__all__"  # 指示 Django 表单应该包含 Task 模型中的所有字段
        exclude = ['org_id']
        widgets = {  # 字典，用于自定义表单字段的 HTML 组件
            # "detail": forms.Textarea,
            "detail": forms.TextInput,
            "user":forms.Select(attrs={'class':'form-control'}),
        }

    def __init__(self, *args, request=None, **kwargs):
        self.request = request
        super().__init__(*args, **kwargs)
        if self.request:
            current_admin_org_id = self.request.session.get('admin_info', {}).get('org_id')
            # current_user_id = self.request.user.id
            self.fields['user'].queryset = models.Admin.objects.filter(
                org_id=current_admin_org_id,
                # created_by=current_user_id
            )
        self.fields['user'].label_from_instance = lambda obj: obj.username
def task_list(request):
    """ 任务列表 """
    # 去数据库获取所有的任务
    current_admin_org_id = request.session.get('admin_info', {}).get('org_id')
    queryset = models.Task.objects.filter(org_id=current_admin_org_id).order_by('-id')
    page_object = Pagination(request, queryset)

    form = TaskModelForm(request=request)

    context = {
        "form": form,
        "queryset": page_object.page_queryset,  # 分完页的数据
        "page_string": page_object.html()  # 生成页码
    }
    return render(request, "task_list.html", context)


# CSRF 是一种安全措施，用于防止网站遭受恶意的跨站请求
# 在 Django 中，当一个视图函数需要处理 POST、PUT、DELETE 等类型的请求时，通常需要在请求中包含一个 CSRF 令牌。
# 如果请求中没有包含有效的 CSRF 令牌，Django 会拒绝该请求。
# 然而，在某些情况下，你可能需要允许跨域的 AJAX 请求，而这些请求可能无法正确地处理 CSRF 令牌。
# 在这种情况下，你可以使用 @csrf_exempt 装饰器来告诉 Django 忽略 CSRF 检查
@csrf_exempt    # 对于函数task_ajax的请求，Django 将不会进行 CSRF 检查
def task_ajax(request):
    print(request.GET)
    print(request.POST)

    data_dict = {"status": True, 'data': [11, 22, 33, 44]}
    # 这行代码创建了一个字典 data_dict，它包含两个键：status 和 data，status 是一个布尔值，data 是一个列表，包含了一些整数
    return HttpResponse(json.dumps(data_dict))
    # 创建了一个 HttpResponse 对象，它将 data_dict 字典转换为 JSON 格式的字符串
    # json.dumps 是 Python 标准库中的一个函数，用于将 Python 对象转换为 JSON 字符串。
    # 然后，这个 JSON 字符串被用作 HTTP 响应的主体返回给客户端

@csrf_exempt
def task_add(request):
    # {'level': ['1'], 'title': ['sdfsdfsdfsd'], 'detail': ['111'], 'user': ['8']}
    # print(request.POST)
    current_admin_org_id = request.session.get('admin_info', {}).get('org_id')
    # 1.用户发送过来的数据进行校验（ModelForm进行校验）

    form = TaskModelForm(data=request.POST,request=request )  # 创建了一个 TaskModelForm 实例，并将 request.POST 数据作为表单数据传入
    if form.is_valid():  # 调用表单的 is_valid() 方法来检查数据是否符合模型字段的验证规则
        #  如果表单数据有效：
        form.instance.org_id = current_admin_org_id
        form.save()  # form.save() 保存表单数据到数据库
        data_dict = {"status": True}  # 创建一个字典，其中 status 键的值为 True，表示操作成功
        return HttpResponse(json.dumps(data_dict))  # 返回一个 HTTP 响应，其中包含 JSON 格式的数据
        # json.dumps 将 Python 字典转换为 JSON 字符串

    #  如果表单数据无效：
    data_dict = {"status": False, 'error': form.errors}  # 表示操作失败，并且包含一个 error 键，其值为表单的错误信息
    return HttpResponse(json.dumps(data_dict, ensure_ascii=False))  # ensure_ascii=False 参数确保 JSON 字符串可以包含非ASCII字符，例如中文

def task_edit(request, nid):
    "编辑任务"
    current_admin_org_id = request.session.get('admin_info', {}).get('org_id')
    row_object = models.Task.objects.get(id=nid,org_id=current_admin_org_id)

    if request.method == 'GET':
        form = TaskModelForm(instance=row_object,request=request)
        return  render(request,'task_edit.html', {'form': form})

    current_admin_org_id = request.session.get('admin_info', {}).get('org_id')
    form = TaskModelForm(data = request.POST,instance=row_object,request=request)
    if form.is_valid():
        form.instance.org_id = current_admin_org_id
        form.save()
        return redirect('/task/list/')
    return render(request,'task_edit.html', {'form': form})

def task_delete(request, nid):
    """"删除用户"""
    current_admin_org_id = request.session.get('admin_info', {}).get('org_id')
    models.Task.objects.filter(id=nid,org_id=current_admin_org_id).delete()
    return redirect('/task/list/')